"""
@Author  : 康帅
@Time    : 2021/1/27 15:46
@Function: 1.作用域和嵌套函数 2.闭包
"""

"""1.嵌套作用域举例"""
x = 99
# def f1():
#     x = 88
#     def f2():
#         print(x)
#     f2()
# f1()

"""在这段代码中，对actinos名称的调用本质上运行了f1运行时我们命名为f2的函数"""
def f1():
    x = 88
    def f2():
        print(x)
    return f2()
actions = f1()


"""2.工厂函数（闭包）"""
# 定义一个外层函数，用来简单的生成并返回一个嵌套的函数，却并不调用这个内嵌套的函数
def maker(N):
    def action(X):
        return X ** N
    return action

f = maker(2)
# 得到的是生成的内嵌套函数的一个引用
print(f)  # <function maker.<locals>.action at 0x000001D680947E50>
print(f(3))  # 3 ** 2
print(f(4))  # 4 ** 2


# 可以使用lambda匿名函数代替内层嵌套的def
def makers(x_data):
    return lambda y_data: y_data ** x_data

data = makers(2)
print(data)  # <function makers.<locals>.<lambda> at 0x00000233A63A7F70>
print((data(3)))  # 9
print(data(4))  # 16

